home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 20 / Cream of the Crop 20 (Terry Blount) (1996).iso / program / wdj0696.zip / ZOLMAN.ZIP / HINTBAR.CPP < prev    next >
C/C++ Source or Header  |  1996-02-19  |  6KB  |  201 lines

  1. // hintbar.cpp -- Member function definitions for hint tag control bar classes.
  2.  
  3. #include "hintbar.h"
  4.  
  5. // Required Constants
  6.  
  7. const int SPACE = 4;     // space around text in hint tags
  8. const int OFFSET_X = 5;  // horizontal offset of hint tag from cursor
  9. const int OFFSET_Y = 20; // vertical offset of hint tag from cursor
  10. const int TIMER_ID = 1;  // ID of timer used for hint tag appearance delay
  11.  
  12. //----------------------------------------------------------------------------
  13. //--- THintButtonGadget Implementation
  14. //----------------------------------------------------------------------------
  15.  
  16. THintButtonGadget::THintButtonGadget(TResId bmpResId, int id, char far *tag,
  17.    TType type, bool enabled, TState state, bool repeat) :
  18.    TButtonGadget(bmpResId, id, type, enabled, state, repeat)
  19. {
  20.    text = 0;
  21.    if (tag) {
  22.       text = new char[strlen(tag)+1];
  23.       strcpy(text, tag);
  24.    }
  25. }
  26.  
  27. THintButtonGadget::~THintButtonGadget(void)
  28. {
  29.    delete text;
  30. }
  31.  
  32. void THintButtonGadget::MouseEnter(uint modKeys, TPoint& pt)
  33. {
  34.    TButtonGadget::MouseEnter(modKeys, pt);
  35.    TYPESAFE_DOWNCAST(Window, THintTagBar)->CreateTag(text);
  36. }
  37.  
  38. void THintButtonGadget::MouseLeave(uint modKeys, TPoint& pt)
  39. {
  40.    TButtonGadget::MouseLeave(modKeys, pt);
  41.    TYPESAFE_DOWNCAST(Window, THintTagBar)->DestroyTag();
  42. }
  43.  
  44.  
  45. //----------------------------------------------------------------------------
  46. //--- TTagWindow Definition
  47. //----------------------------------------------------------------------------
  48.  
  49. class TTagWindow : public TWindow
  50. {
  51. public:
  52.    TTagWindow(TWindow *parent, const char far* title);
  53.    virtual bool Create(void);
  54.    virtual void Paint(TDC& dc, bool erase, TRect& rect);
  55. };
  56.  
  57.  
  58. //----------------------------------------------------------------------------
  59. //--- TTagWindow Implementation
  60. //----------------------------------------------------------------------------
  61.  
  62. TTagWindow::TTagWindow (TWindow *parent, const char far* title)
  63.    : TWindow(parent, title)
  64. {
  65.    Attr.Style = WS_POPUP | WS_DISABLED;   // invisible window
  66. }
  67.  
  68. bool TTagWindow::Create(void)
  69. {
  70.    bool result;
  71.    TPoint point = TYPESAFE_DOWNCAST(Parent, THintTagBar)->GetLastPoint();
  72.    TRect r = Parent->GetWindowRect();
  73.    Attr.X = point.x + r.left + OFFSET_X;
  74.    Attr.Y = point.y + r.top + OFFSET_Y;
  75.    Attr.W = 1;       // to be calculated at Paint time
  76.    Attr.H = 1;
  77.    result = TWindow::Create();
  78.    Show(SW_SHOWNOACTIVATE);   // make visible without changing active
  79.    return result;
  80. }
  81.  
  82. void TTagWindow::Paint(TDC& dc, bool erase, TRect& rect)
  83. {
  84.    TWindow::Paint(dc, erase, rect);
  85.  
  86.    TRect r;
  87.    TSize sz;
  88.    THintTagBar *owner = TYPESAFE_DOWNCAST(Parent, THintTagBar);
  89.    dc.SelectObject(owner->GetFont());
  90.    sz = dc.GetTextExtent(Title, strlen(Title));
  91.    Attr.W = sz.cx + SPACE;
  92.    Attr.H = sz.cy + SPACE;
  93.    MoveWindow(Attr.X, Attr.Y, Attr.W, Attr.H, true);
  94.    dc.SelectObject(*(owner->GetBackgroundBrush()));
  95.    dc.SelectObject(*(owner->GetBorderPen()));
  96.    r = TRect(0, 0, Attr.W, Attr.H);
  97.    dc.Rectangle(r);
  98.    dc.SetTextColor(owner->GetTextColor());
  99.    dc.SetBkMode(TRANSPARENT);
  100.    dc.DrawText(Title, -1, r, DT_CENTER | DT_VCENTER | DT_NOCLIP |
  101.       DT_EXTERNALLEADING | DT_SINGLELINE);
  102.    dc.RestoreObjects();
  103. }
  104.  
  105.  
  106.  
  107. //----------------------------------------------------------------------------
  108. //--- THintTagBar Implementation
  109. //----------------------------------------------------------------------------
  110.  
  111. DEFINE_RESPONSE_TABLE1(THintTagBar, TControlBar)
  112.   EV_WM_LBUTTONDOWN,
  113.   EV_WM_MOUSEMOVE,
  114.   EV_WM_TIMER,
  115. END_RESPONSE_TABLE;
  116.  
  117. THintTagBar::THintTagBar(TWindow *parent, TTileDirection direction,
  118.    TFont *font, TColor textColor, TColor borderColor, TColor brushColor,
  119.    TModule *module) : TControlBar(parent, direction, font, module),
  120.    lastPoint(0,0)
  121. {
  122.    tag = 0;
  123.    delayTag = 0;
  124.    tagsActive = false;
  125.    colorTag = textColor;
  126.    penTag = new TPen(borderColor);
  127.    brushTag = new TBrush(brushColor);
  128. }
  129.  
  130. THintTagBar::~THintTagBar(void)
  131. {
  132.    DestroyTag();
  133.    delete penTag;
  134.    delete brushTag;
  135. }
  136.  
  137. bool THintTagBar::IdleAction(long idleCount)
  138. {
  139.    if (idleCount == 0) {
  140. // If the mouse is no longer inside the control bar, turn off hint tags
  141.       TPoint pt;
  142.       GetCursorPos(pt);
  143.       if (!GetWindowRect().Contains(pt)) ShutDownTags();
  144.    }
  145.    return TControlBar::IdleAction(idleCount);
  146. }
  147.  
  148. void THintTagBar::EvLButtonDown(uint modKeys, TPoint& point)
  149. {
  150. // Left button down anywhere in control bar turns off hints
  151.    ShutDownTags();
  152.    TControlBar::EvLButtonDown(modKeys, point);
  153. }
  154.  
  155. void THintTagBar::EvMouseMove(uint modKeys, TPoint& point)
  156. {
  157.    if (delayTag > 0) {  // none of this matters if hint tags are disabled
  158.       if (point != lastPoint) {
  159.          lastPoint = point;
  160.          if (!tagsActive) {      // if hints are not yet active then...
  161.             KillTimer(TIMER_ID); // ...stop any timer in progress and...
  162.             if (tag) SetTimer(TIMER_ID, delayTag);
  163.          }                       // ...restart if there's a tag waiting
  164.       }
  165.    }
  166.    TControlBar::EvMouseMove(modKeys, point);
  167. }
  168.  
  169. void THintTagBar::EvTimer(uint timerId)
  170. // Timer has fired -- user calmed down long enough to see the tags!
  171. {
  172.    if (timerId == TIMER_ID) {     // ensure this is the timer we expected
  173.       KillTimer(TIMER_ID);
  174.       tagsActive = true;
  175.       if (tag) tag->Create();  // show tag for gadget the user lingered on
  176.    }
  177. }
  178.  
  179. void THintTagBar::CreateTag(const char far *text)
  180. {
  181.    if (delayTag > 0) {     // do nothing if hint tags disabled
  182.       DestroyTag();        // there can be only one!
  183.       tag = new TTagWindow(this, text);
  184.       if (tagsActive) tag->Create();    // only show the tag if active
  185.    }
  186. }
  187.  
  188. void THintTagBar::DestroyTag(void)
  189. {
  190.    delete tag;
  191.    tag = 0;
  192. }
  193.  
  194. void THintTagBar::ShutDownTags(void)
  195. {
  196.    KillTimer(TIMER_ID);
  197.    DestroyTag();
  198.    tagsActive = false;
  199. }
  200.  
  201.